/*
 * PPD.c
 *
 *  Created on: 15/09/2011
 *      Author: agustin
 */



#include "leerEscribir.h"
#include "PPD.h"
#include "CHS.h"

extern t_direccion_fisica posActualCabezal;
extern char *PATH;
extern char* mapeo;
extern int cantEscrituras;
extern int8_t archivo;

int8_t abrirArchivo() {


	uint16_t sizeofpage;
	struct stat estado_arch;
	archivo = open(PATH, O_RDWR);
	if (archivo < 0) {
		perror("No se puede abrir el archivo");
	};
	sizeofpage = getpagesize();

	fstat(archivo,&estado_arch);
	mapeo = (char *) mmap(NULL, estado_arch.st_size, PROT_READ | PROT_WRITE , MAP_SHARED, archivo,0);
	posix_madvise(mapeo, sizeofpage, MADV_SEQUENTIAL);
	return archivo;
}

void leerSector(t_sector *sector, uint8_t archivo, uint16_t retardo) {
	//char *data,buffer[512];
	//uint16_t sizeofpage, offset;
	//uint32_t NroPagina;
	//sizeofpage = getpagesize();
	//NroPagina = (obtener_dir_log(sector->direccion) / 8) * sizeofpage; // Cociente de la division //
	//offset = (obtener_dir_log(sector->direccion) % 8) * 512; // Resto de la division //
	//data = (char *) mmap(NULL, sizeofpage, PROT_READ, MAP_SHARED, archivo,NroPagina);
	//memcpy(buffer, mapeo+(obtener_dir_log(sector->direccion))*512, 512);
	//munmap(data, sizeofpage);
	posActualCabezal = sumarSectores(sector->direccion,1);
	memcpy(sector->datos, mapeo+(obtener_dir_log(sector->direccion))*512,512);
	usleep(retardo*1000); //todo aca cambiamos a usleep
}

void escribirSector(t_sector sector, uint8_t archivo, uint16_t retardo) {
	//char *data = NULL;
	//uint16_t sizeofpage, offset;
	//uint32_t NroPagina;
	//sizeofpage = getpagesize();
	//NroPagina = (obtener_dir_log(sector.direccion) / 8) * sizeofpage; // Cociente de la division //
	//offset = (obtener_dir_log(sector.direccion) % 8) * 512; // Resto de la division //
	//data = (char *) mmap(NULL, sizeofpage, PROT_READ | PROT_WRITE, MAP_SHARED, archivo, NroPagina);
	memcpy(mapeo + (obtener_dir_log(sector.direccion)*512), sector.datos, 512);
	usleep(retardo*1000); //todo aca tambien

	cantEscrituras++;
	if(cantEscrituras==32768){
		struct stat estado_arch;
		fstat(archivo,&estado_arch);
		msync(mapeo , estado_arch.st_size, MS_SYNC);
		cantEscrituras=0;
	}
	//munmap(data, sizeofpage);
	posActualCabezal = sumarSectores(sector.direccion,1);
}
